"""
Python 完整语法示例
包含与 Java 的主要差异说明
"""

# =============================================================================
# 1. 基础语法和变量
# =============================================================================

print("=== 1. 基础语法和变量 ===")

# 变量声明 - 无需类型声明
name = "Python"  # 字符串
age = 30  # 整数
height = 1.75  # 浮点数
is_developer = True  # 布尔值
nothing = None  # 空值，类似 Java 的 null

# 与 Java 差异：动态类型，变量可以重新赋值为不同类型
x = 10
print(f"x = {x}, type = {type(x)}")  # x = 10, type = <class 'int'>
x = "现在我是字符串"
print(f"x = {x}, type = {type(x)}")  # x = 现在我是字符串, type = <class 'str'>

# 多重赋值
a, b, c = 1, 2, 3
print(f"a={a}, b={b}, c={c}")

# 链式赋值
x = y = z = 0
print(f"x={x}, y={y}, z={z}")

# =============================================================================
# 2. 数据类型
# =============================================================================

print("\n=== 2. 数据类型 ===")

# 数字类型
int_num = 42
float_num = 3.14
complex_num = 2 + 3j

# 字符串 (与 Java String 类似但更多功能)
text = "Hello Python"
multi_line = """这是
多行
字符串"""

# 字符串格式化 (比 Java 更灵活)
name = "Alice"
formatted = f"Hello, {name}! 2+2={2 + 2}"  # f-string (Python 3.6+)
print(formatted)

# 布尔类型
is_true = True
is_false = False

# =============================================================================
# 3. 数据结构
# =============================================================================

print("\n=== 3. 数据结构 ===")

# 列表 List (类似 Java ArrayList)
fruits = ["apple", "banana", "orange"]
fruits.append("grape")  # 添加元素
fruits.insert(1, "pear")  # 插入元素
fruits.remove("banana")  # 删除元素
print(f"列表: {fruits}")

# 列表切片 (Python 特色)
numbers = [0, 1, 2, 3, 4, 5]
print(f"前三个: {numbers[:3]}")  # [0, 1, 2]
print(f"后三个: {numbers[-3:]}")  # [3, 4, 5]
print(f"反转: {numbers[::-1]}")  # [5, 4, 3, 2, 1, 0]

# 列表推导式 (Python 特色)
squares = [x ** 2 for x in range(10)]
even_squares = [x ** 2 for x in range(10) if x % 2 == 0]
print(f"平方数: {squares}")
print(f"偶数平方: {even_squares}")

# 元组 Tuple (不可变列表，类似 Java 的 final List)
coordinates = (10, 20)
point = 30, 40  # 括号可省略
single_element = (42,)  # 单元素元组需要逗号

# 元组解包
x, y = coordinates
print(f"坐标: x={x}, y={y}")

# 字典 Dictionary (类似 Java HashMap)
person = {
    "name": "John",
    "age": 30,
    "city": "New York"
}
person["job"] = "Developer"  # 添加/修改
del person["city"]  # 删除
print(f"字典: {person}")

# 字典操作
print(f"键: {list(person.keys())}")
print(f"值: {list(person.values())}")

# 字典推导式
square_dict = {x: x ** 2 for x in range(5)}
print(f"字典推导式: {square_dict}")

# 集合 Set (类似 Java HashSet)
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
print(f"并集: {set1 | set2}")  # {1, 2, 3, 4, 5, 6, 7, 8}
print(f"交集: {set1 & set2}")  # {4, 5}
print(f"差集: {set1 - set2}")  # {1, 2, 3}

# =============================================================================
# 4. 控制流语句
# =============================================================================

print("\n=== 4. 控制流语句 ===")

# if-elif-else (注意冒号和缩进)
score = 85
if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"
elif score >= 70:
    grade = "C"
else:
    grade = "D"
print(f"分数 {score} 等级: {grade}")

# for 循环 (类似 Java 的 for-each)
for fruit in fruits:
    print(f"水果: {fruit}")

# 带索引的循环
for i, fruit in enumerate(fruits):
    print(f"{i}: {fruit}")

# range 函数 (类似 Java 的 for(int i=0; i<n; i++))
for i in range(5):  # 0,1,2,3,4
    print(f"数字: {i}")

for i in range(2, 6):  # 2,3,4,5
    print(f"范围: {i}")

for i in range(0, 10, 2):  # 0,2,4,6,8
    print(f"步长: {i}")

# while 循环
count = 5
while count > 0:
    print(f"倒计时: {count}")
    count -= 1

# 循环控制
for i in range(10):
    if i == 3:
        continue  # 跳过本次循环
    if i == 7:
        break  # 终止循环
    print(f"控制: {i}")

# =============================================================================
# 5. 函数
# =============================================================================

print("\n=== 5. 函数 ===")


# 基础函数
def greet(name):
    """简单的问候函数 (这是文档字符串)"""
    return f"Hello, {name}!"


print(greet("World"))


# 默认参数
def introduce(name, age=25, city="Unknown"):
    return f"{name}, {age}岁, 来自{city}"


print(introduce("Alice"))
print(introduce("Bob", 30, "Beijing"))

# 关键字参数
print(introduce(age=35, name="Charlie", city="Shanghai"))


# 可变参数 *args (类似 Java 的 ... 可变参数)
def sum_all(*numbers):
    return sum(numbers)


print(f"求和: {sum_all(1, 2, 3, 4, 5)}")


# 关键字可变参数 **kwargs
def print_info(**info):
    for key, value in info.items():
        print(f"{key}: {value}")


print_info(name="David", age=28, job="Engineer")


# 函数作为一等公民
def apply_operation(func, x, y):
    return func(x, y)


def multiply(a, b):
    return a * b


result = apply_operation(multiply, 6, 7)
print(f"函数作为参数: {result}")

# lambda 表达式 (类似 Java 的 lambda)
square = lambda x: x ** 2
print(f"Lambda: {square(5)}")

# =============================================================================
# 6. 面向对象编程
# =============================================================================

print("\n=== 6. 面向对象编程 ===")


class Person:
    """人类 (与 Java 类对比)"""

    # 类属性 (类似 Java 的 static 变量)
    species = "Homo sapiens"

    # 构造方法 (类似 Java 的构造函数)
    def __init__(self, name, age):
        # 实例属性 (类似 Java 的实例变量)
        self.name = name
        self.age = age
        # 注意: Python 没有真正的 private，约定以下划线开头表示"私有"
        self._internal_data = "内部数据"

    # 实例方法 (类似 Java 的实例方法)
    def introduce(self):
        return f"我叫{self.name}，今年{self.age}岁"

    # 类方法 (类似 Java 的 static 方法)
    @classmethod
    def get_species(cls):
        return cls.species

    # 静态方法 (类似 Java 的 static 方法，但不接收 cls/self)
    @staticmethod
    def is_adult(age):
        return age >= 18

    # 字符串表示 (类似 Java 的 toString())
    def __str__(self):
        return f"Person(name={self.name}, age={self.age})"

    # 用于 repr() 函数的表示
    def __repr__(self):
        return f"Person('{self.name}', {self.age})"


# 继承
class Student(Person):
    """学生类，继承 Person"""

    def __init__(self, name, age, student_id):
        # 调用父类构造方法
        super().__init__(name, age)
        self.student_id = student_id

    # 方法重写
    def introduce(self):
        return f"我是学生{self.name}，学号{self.student_id}"

    # 添加新方法
    def study(self, subject):
        return f"{self.name}正在学习{subject}"


# 使用类
person = Person("张三", 25)
student = Student("李四", 20, "S12345")

print(person.introduce())
print(student.introduce())
print(student.study("Python"))

print(f"类属性: {Person.species}")
print(f"静态方法: {Person.is_adult(25)}")

# =============================================================================
# 7. 异常处理
# =============================================================================

print("\n=== 7. 异常处理 ===")

try:
    # 可能出错的代码
    result = 10 / 0
    with open("nonexistent_file.txt", "r") as file:
        content = file.read()
except ZeroDivisionError:
    print("错误：不能除以零")
except FileNotFoundError as e:
    print(f"文件不存在: {e}")
except Exception as e:
    print(f"其他错误: {e}")
else:
    print("没有发生错误")
finally:
    print("这里总是会执行")


# 抛出异常
def check_age(age):
    if age < 0:
        raise ValueError("年龄不能为负数")
    return age


try:
    check_age(-5)
except ValueError as e:
    print(f"捕获到异常: {e}")

# =============================================================================
# 8. 文件操作
# =============================================================================

print("\n=== 8. 文件操作 ===")

# 写入文件
with open("example.txt", "w", encoding="utf-8") as file:
    file.write("Hello, Python!\n")
    file.write("这是第二行\n")

# 读取文件
with open("example.txt", "r", encoding="utf-8") as file:
    content = file.read()
    print("文件内容:")
    print(content)

# 逐行读取
with open("example.txt", "r", encoding="utf-8") as file:
    print("逐行读取:")
    for line in file:
        print(line.strip())

# =============================================================================
# 9. 模块和包
# =============================================================================

print("\n=== 9. 模块和包 ===")

# 导入标准库模块
import math
import os
from datetime import datetime, timedelta

print(f"π = {math.pi}")
print(f"当前目录: {os.getcwd()}")
print(f"当前时间: {datetime.now()}")

# =============================================================================
# 10. 高级特性
# =============================================================================

print("\n=== 10. 高级特性 ===")


# 生成器 (节省内存)
def countdown(n):
    """生成器函数"""
    while n > 0:
        yield n
        n -= 1


print("倒计时生成器:")
for num in countdown(5):
    print(num)

# 生成器表达式
squares_gen = (x ** 2 for x in range(5))
print(f"生成器表达式: {list(squares_gen)}")


# 装饰器 (修改函数行为)
def logger(func):
    """日志装饰器"""

    def wrapper(*args, **kwargs):
        print(f"调用函数: {func.__name__}")
        result = func(*args, **kwargs)
        print(f"函数 {func.__name__} 执行完毕")
        return result

    return wrapper


@logger
def add_numbers(a, b):
    return a + b


print(f"装饰器示例: {add_numbers(3, 4)}")


# 上下文管理器 (with 语句)
class Timer:
    """简单的计时器上下文管理器"""

    def __enter__(self):
        self.start = datetime.now()
        print("开始计时")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.end = datetime.now()
        duration = self.end - self.start
        print(f"计时结束，耗时: {duration.total_seconds()}秒")


with Timer():
    # 在这里执行需要计时的代码
    sum(range(1000000))

# =============================================================================
# 11. 与 Java 主要差异总结
# =============================================================================

print("\n=== 11. 与 Java 主要差异总结 ===")

"""
Java 开发者需要注意的 Python 特性：

1. 语法简洁性
   - 不需要分号
   - 使用缩进而不是大括号
   - 动态类型，无需声明变量类型

2. 数据结构
   - 列表推导式、字典推导式
   - 内置丰富的数据结构操作
   - 切片操作

3. 函数特性
   - 函数作为一等公民
   - lambda 表达式
   - 装饰器

4. 面向对象
   - 没有真正的 private/protected
   - 多重继承
   - 特殊方法 (__init__, __str__ 等)

5. 其他
   - 生成器 (yield)
   - 上下文管理器 (with)
   - 鸭子类型 (关注行为而非类型)
"""

print("\n=== Python 学习完成！===")

# 清理临时文件
import os

if os.path.exists("example.txt"):
    os.remove("example.txt")